package org.seanye.erp.view.model;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.seanye.erp.view.util.DateUtil;

public class Store implements Serializable {

    private static final long serialVersionUID = -7263067737756776693L;

    List<WeekStore> stores = new LinkedList<WeekStore>();

    public List<WeekStore> getStores() {
	return stores;
    }

    public int howManyWeeks() {
	return stores.size();
    }

    public static Store createDefaultStore() {
	Store store = new Store();
	store.nextWeekStore(null);
	return store;
    }

    public boolean delete(WeekStore store) {
	if (store == null) {
	    return true;
	}
	return stores.remove(store);
    }

    public boolean isValid() {
	if (stores.size() == 0)
	    return true;
	else {
	    WeekStore privous = null;
	    for (Iterator<WeekStore> iterator = stores.iterator(); iterator
		    .hasNext();) {
		WeekStore store = iterator.next();
		if (privous == null) {
		    continue;
		} else {
		    if (privous.getStartDate().equals(store.getStartDate())
			    || privous.getStartDate().after(
				    store.getStartDate())) {
			return false;
		    }
		}

	    }
	    return true;
	}
    }

    public WeekStore nextWeekStore(final WeekStore weekStore) {
	if (weekStore == null) {
	    WeekStore ws = new WeekStore();
	    ws.setStartDate(Calendar.getInstance().getTime());
	    stores.add(ws);
	    return ws;
	} else {
	    Date prvious = weekStore.getStartDate();
	    Calendar ins = Calendar.getInstance();
	    ins.setTime(prvious);
	    ins.add(Calendar.DAY_OF_YEAR, 7);// next week
	    WeekStore ws = new WeekStore();
	    ws.setStartDate(ins.getTime());
	    stores.add(ws);
	    return ws;
	}
    }

    public boolean isNextWeekValid(final WeekStore store) {
	if (store == null) {
	    return true;
	} else {
	    for (int i = stores.indexOf(store); i < stores.size(); i++) {
		try {
		    WeekStore ws = stores.get(i + 1);
		    if (ws.getStartDate().equals(
			    DateUtil.nextWeek(store.getStartDate()))) {
			return false;
		    }
		} catch (Exception e) {

		}
	    }
	    return true;
	}
    }

    public boolean isPrivWeekValid(final WeekStore store) {
	if (store == null) {
	    return true;
	} else {
	    for (int i = stores.indexOf(store); i > 0; i--) {
		try {
		    WeekStore ws = stores.get(i - 1);
		    if (ws.getStartDate().equals(
			    DateUtil.privWeek(store.getStartDate()))) {
			return false;
		    }
		} catch (Exception e) {

		}
	    }
	    return true;
	}
    }

    public WeekStore privWeekStore(final WeekStore weekStore) {
	Date prvious = weekStore.getStartDate();
	Calendar ins = Calendar.getInstance();
	ins.setTime(prvious);
	ins.add(Calendar.DAY_OF_YEAR, -7);// privous week
	WeekStore ws = new WeekStore();
	ws.setStartDate(ins.getTime());
	stores.add(stores.indexOf(weekStore), ws);
	return ws;
    }
}
